package com.lg.cms.controller.admin.upload;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import com.lg.cms.constant.StorageConst;
import com.lg.cms.dto.ALiYunConfigDTO;
import com.lg.cms.dto.QiNiuYunConfigDTO;
import com.lg.cms.entity.SaveConfig;
import com.lg.cms.entity.SuperUser;
import com.lg.cms.service.SaveConfigService;
import com.lg.cms.utils.SubjectUtil;
import com.lg.cms.utils.UploadFileUtil;
import com.lg.cms.vo.LayerTableVO;
import com.qiniu.util.Json;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @Description: 上传视图控制器
 * @Author: wuyuhang
 * @create: 2020-09-23 08:49
 */

//@RestController
@Controller
@RequestMapping("/admin/cloud")
@Api(value = "上传云存储api", tags = "上传云存储api")
@Slf4j
public class UploadController {

    @Autowired
    SaveConfigService saveConfigService;

    @Resource
    UploadFileUtil uploadFileUtil;

    @GetMapping("/list")
    public String get(Model model, HttpServletRequest request){
        model.addAttribute("request", request);
        model.addAttribute("user", SubjectUtil.getSuperUser());
        return "/admin/upload/upload";
    }

    @GetMapping("/list_vo")
    @ResponseBody
    public LayerTableVO<SaveConfig> list(){
        LayerTableVO<SaveConfig> vo = new LayerTableVO<>();
        List<SaveConfig> configList = saveConfigService.list();
        vo.setData(configList);
        vo.setCount((long) configList.size());
        vo.setCode(0);
        return vo;
    }

    @GetMapping("/get_config")
    @ResponseBody
    public Object getConfig(String id){
        if(id == null){
            return null;
        }
        QiNiuYunConfigDTO qiNiuYunConfigDTO = null;
        ALiYunConfigDTO aLiYunConfigDTO = null;
        SaveConfig config = saveConfigService.getById(id);
        if(config.getKey().equals("qiniuyun")){
            qiNiuYunConfigDTO = Json.decode(config.getValue(), QiNiuYunConfigDTO.class);
            return qiNiuYunConfigDTO;
        }else if(config.getKey().equals("aliyun")){
            aLiYunConfigDTO = Json.decode(config.getValue(), ALiYunConfigDTO.class);
            return aLiYunConfigDTO;
        }else{
            return null;
        }

    }

    /**
     * 使用
     * @param id
     * @return R
     */
    @PostMapping("/save")
    @ResponseBody
    @ApiOperation("使用配置")
    public R<?> saveConfig(Integer id){
      List<SaveConfig> saveConfigList = saveConfigService.list();
      List<SaveConfig> saveList = new ArrayList<>();
      for(SaveConfig config: saveConfigList){
          if(config.getId().equals(id)){
              config.setUse(true);
          }else{
              config.setUse(false);
          }
          saveList.add(config);
      }
      boolean result = saveConfigService.updateBatchById(saveList);
      if(!result){
          return R.failed("使用配置失败");
      }
      return R.ok(null);
    }

    /**
     * 七牛云配置
     * @param qiNuiYun
     * @return
     */
    @ApiOperation(value = "七牛云配置")
    @PostMapping("/qiniuyun_config")
    @ResponseBody
    public R<?> updateQiNiuYunConfig(QiNiuYunConfigDTO qiNuiYun){
        if(!qiNuiYun.checkData()){
            return R.failed("请输入完整配置");
        }
        //七牛云配置序列化
        String jsonObject = Json.encode(qiNuiYun);
        //获取七牛云配置信息
        SaveConfig saveConfig = saveConfigService.getOne(new QueryWrapper<SaveConfig>().eq("`key`", "qiniuyun"));
        //
        saveConfig.setValue(jsonObject);
        boolean result = saveConfigService.updateById(saveConfig);
        if(!result){
            return R.failed("配置失败");
        }
        log.info("配置了七牛云config");
        return R.ok(null);
    }

    /**
     * 阿里云配置
     * @param aLiYun
     * @return
     */
    @ApiOperation(value = "阿里云配置")
    @PostMapping("/aliyun_config")
    @ResponseBody
    public R<?> updateALiYunConfig(ALiYunConfigDTO aLiYun){
        if(!aLiYun.checkData()){
            return R.failed("请输入完整配置");
        }
        String jsonObject = Json.encode(aLiYun);
        SaveConfig saveConfig = saveConfigService.getOne(new QueryWrapper<SaveConfig>().eq("`key`", "aliyun"));
        saveConfig.setValue(jsonObject);
        boolean result = saveConfigService.updateById(saveConfig);
        if(!result){
            return R.failed("配置失败");
        }
        log.info("配置了阿里云config");
        return R.ok(null);
    }

    /**
     * 上传测试页面
     * @return
     */
//    @GetMapping("/uploadView")
    public String uploadView(){
        return "/admin/wyh-test/upload-test-view";
    }

    /**
     * 上传七牛云测试视图
     * @param file
     * @return
     */
//    @PostMapping("/uploadAddQiniuyun")
//    @ResponseBody
    public String uploadQiniu(MultipartFile file){
        R<?> r = uploadFileUtil.uploadQiNiuYun(file);
        if(r.getCode() == 0){
            return (String)r.getData();
        }else{
            return r.getMsg();
        }

    }

    /**
     * 上传本地测试视图
     * @param file
     * @return
     */
//    @PostMapping("/uploadAddLocal")
//    @ResponseBody
    public String uploadLocal(MultipartFile file){
        R<?> r = uploadFileUtil.uploadLocal(file);
        if(r.getCode() == 0){
            return (String)r.getData();
        }else{
            return r.getMsg();
        }

    }

    /**
     * 上传阿里云测试视图
     * @param file
     * @return
     */
//    @PostMapping("/uploadAddAliyun")
//    @ResponseBody
    public String uploadAli(MultipartFile file){
        R<?> r = uploadFileUtil.uploadALiYun(file);
        if(r.getCode() == 0){
            return (String)r.getData();
        }else{
            return r.getMsg();
        }
    }

//    @GetMapping("test_qiniuyun")
//    @ResponseBody
    public String testQiniuyun(){
        R<String> r = uploadFileUtil.testQiNiuYun();
        if(r.getCode() == 0){
            return r.getData();
        }else{
            return r.getMsg();
        }
    }
    @GetMapping("test_aliyun")
    @ResponseBody
    public String testAliyun(){
        R<String> r = uploadFileUtil.testALiYun();
        if(r.getCode() == 0){
            return r.getData();

        }else{
            return r.getMsg();
        }
    }
}